Мы открыли новый стартап, занимающийся организацией квестов.
Проект работает по франшизной системе. Для квестов написаны несколько базовых сценариев, специально приглашёнными для
этого креативными агентствами. Попасть на игру можно, забронировав конкретное время и выбрав определённый сценарий.
Длительность игры 50 минут, за это время игроки должны успеть пройти все задания и только в этом случае игра может
считаться успешно пройденной, если игрокам понадобится больше времени на прохождение, игра не считается успешно
пройденной, а только завершённой.
Проект уже работает несколько месяцев. Также мы сделали сайт, куда могут заходить наши клиенты. Существует возможность
регистрации и оформления заявки на бронирование игры по расписанию.
Нам необходимо посмотреть в динамике, как по неделям и месяцам меняется посещаемость сайта, какая чать клиентов проходит регитсрацию, какая оставляет заявку и сколько в итоге приходит на игру.
На основе полученных данных сделать выводы о том, какие есть слабые места и есть ли точки роста.
За время работы проекта мы успеели собрать определенную базу с данными о ведении нашего бизнеса, использую которую мы можем проводить необходимую аналитику.
Структурно наша модель хранилища данных выглядит следующим образом:
table::Partner
table::Locaiton
table::Legend
table::Quest
table::Employee
table::Game
table::Client
table::Account
table::Application
import plotly.io as pio
pio.renderers.default='notebook'
import plotly.graph_objects as go
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import psycopg2
"""
> Подключаемся к базе данных нашего проекта
> Формируем DataFrame
> Пишем SQL запрос, хотим получить общее количество
- > посещений, регистраций, заявок и пройденных игр по дням
"""
conn = psycopg2.connect(
host="158.160.52.106",
port=5432,
database="postgres",
user="***",
password="***",
)
cur = conn.cursor()
df = pd.read_sql('''
with visit as (
select date_trunc('day', visit_dttm) action_date,
count(distinct client_rk) visits_amount
from msu_analytics.client c
group by 1
),
registration as (
select date_trunc('day', registration_dttm) action_date,
count(distinct account_rk) as reg_amount
from msu_analytics.account a
group by 1
),
application as (
select date_trunc('day', application_dttm) action_date,
count(distinct application_rk) application_amount
from msu_analytics.application a2
group by 1
),
game as (
select date_trunc('day', game_dttm) action_date,
count(distinct game_rk) game_amount
from msu_analytics.game g
where game_flg = 1
group by 1
)
select date_trunc('day', action_date) action_date,
sum(visits_amount) visits_amount,
sum(reg_amount) reg_amount,
sum(application_amount) application_amount,
sum(game_amount) game_amount
from visit v
left join registration r using(action_date)
left join application a using(action_date)
left join game g using(action_date)
group by 1
order by 1
''', conn)
"""
> Получаем сформированный DataFrame df
"""
# заполняем NaN занчения нулями
df = pd.read_sql(sql_query, conn).fillna(0)
# приводим к типу datetime
df.action_date = pd.to_datetime(table.action_date)
"""
> Формируем данные для построеения графика
> Необходимо сгруппировать данный из табцы по месяцам
"""
df_month = df.groupby([pd.Grouper(key='action_date', freq='M')])\
[['visits_amount', 'reg_amount', 'application_amount', 'game_amount']].sum().reset_index()
df_month
"""
> Формируем данные для построеения графика
> Необходимо сгруппировать данный из табцы по неделям
"""
df_week = df.groupby([pd.Grouper(key='action_date', freq='W')])\
[['visits_amount', 'reg_amount', 'application_amount', 'game_amount']].sum().reset_index()
df_week.head()
# Так как нам необходимо построить воронку, в которой мы увидим Conversion rate пути клиента
# от посещения сайта до пройденной игры
# преобразовываем абсолютные велилины в относительные
def convert_to_percent(col1, col2):
return pd.Series(data=map(lambda x, y: round((y / x) * 100, 2) if y != 0 else y, col1, col2))
# строим воронку по месяцам
from plotly.subplots import make_subplots
fig = make_subplots(specs=[[{"secondary_y": True}]],rows=1, cols=1)
fig.add_trace(go.Scatter(
x=df_month['action_date'],
y=convert_to_percent(df_month['visits_amount'], df_month['reg_amount']),
showlegend=True, name='% регистраций'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Scatter(
x=df_month['action_date'],
y=convert_to_percent(df_month['visits_amount'], df_month['application_amount']),
showlegend=True, name='% заявок'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Scatter(
x=df_month['action_date'],
y=convert_to_percent(df_month['visits_amount'], df_month['game_amount']),
showlegend=True, name='% состоявшихся игр'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Bar(
x=df_month['action_date'],
y=df_month['visits_amount'],
showlegend=True,opacity=0.3, name='кол-во клиентов'),row=1,col=1,secondary_y=True)
fig.update_layout(title='Воронка Тинькофф квест',xaxis_title='Дата визита', yaxis_title='Конверсия, %')
fig.show('notebook')
Такая визуализация очень лаконична, проста, по ней легко сориентироваться, как выглядят наши конверсии. На одном графике получилось изобразить в динамике % регистрации, заявок, игр от пришедших на сайт клиентов и абсолютное кол-во клиентов на 1 этапе воронки.
%pylab inline
# строим воронку по неделям
fig = make_subplots(specs=[[{"secondary_y": True}]],rows=1, cols=1)
fig.add_trace(go.Scatter(
x=df_week['action_date'],
y=convert_to_percent(df_week['visits_amount'], df_week['reg_amount']),
showlegend=True, name='% регистраций'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Scatter(
x=df_week['action_date'],
y=convert_to_percent(df_week['visits_amount'], df_week['application_amount']),
showlegend=True, name='% заявок'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Scatter(
x=df_week['action_date'],
y=convert_to_percent(df_week['visits_amount'], df_week['game_amount']),
showlegend=True, name='% состоявшихся игр'),row=1,col=1,secondary_y=False)
fig.add_trace(go.Bar(
x=df_week['action_date'],
y=df_week['visits_amount'],
showlegend=True,opacity=0.3, name='кол-во клиентов'),row=1,col=1,secondary_y=True)
fig.update_layout(title='Воронка Тинькофф квест',xaxis_title='Дата визита', yaxis_title='Конверсия, %')
fig.show('notebook')
Из построенных графиков можно сделать следующие выводы:
Точки роста продукта: